using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Studio7i.Dominio;
using Studio7i.Persistencia;
//cambiar el nombre a Studio71.PruebasSalas
namespace Studio7i.Pruebas
{
    public class TestSalaDAO
    {

        [TestFixture]
        public class Test1_salaDAO
        {
            // Atributos a utilizar durante las pruebas
            private ISalaDAO salaDAO = null;
            //private ILocalDAO localDAO = null;
            private int codigoGenerado = 0;
            
            [TestFixtureSetUp]
            public void PrepararPruebas()
            {
                // 1. Definimos la implementación del DAO a probar (ADO / NH / EF)
                salaDAO = new Persistencia.SalaDAO();

                // 2. Eliminamos todos las salas en BD antes de las pruebas
                foreach (Sala sala in salaDAO.ListarTodos())
                    salaDAO.Eliminar(sala);

                // 3. Creamos datos para tenerlos disponibles en las pruebas
                Local local2 = new Local(1, "Local 1","direccion2", "Lima");
                salaDAO.Crear(new Sala() { CodSala = 1, Nombre = "SALA VIP", Capacidad = 100, Caracteristicas = "GRANDE",Comentarios = "BUENA ACUSTICA", Local =local2});
                salaDAO.Crear(new Sala() { CodSala = 2, Nombre = "Salsa", Capacidad = 50, Caracteristicas = "Mediana", Comentarios = "Especial para Orquesta", Local = local2 });
                salaDAO.Crear(new Sala() { CodSala = 3, Nombre = "Vocal", Capacidad = 3, Caracteristicas = "Pequeña", Comentarios = "Especial para voz", Local = local2 });
                //salaDAO.Crear(new Sala() { CodSala = 4, Nombre = "SALA VIP", Capacidad = 100, Caracteristicas = "GRANDE", Comentarios = "BUENA ACUSTICA", Local = local2 });
                //salaDAO.Crear(new Sala() { CodSala = 5, Nombre = "SALA VIP", Capacidad = 100, Caracteristicas = "GRANDE", Comentarios = "BUENA ACUSTICA", Local = local2 });
                //salaDAO.Crear(new Sala() { CodSala = 6, Nombre = "SALA VIP", Capacidad = 100, Caracteristicas = "GRANDE", Comentarios = "BUENA ACUSTICA", Local = local2 });
                //salaDAO.Crear(new Sala() { CodSala = 7, Nombre = "SALA VIP", Capacidad = 100, Caracteristicas = "GRANDE", Comentarios = "BUENA ACUSTICA", Local = local2 });


            }
            [Test]
            public void Test1_Crear()
            {
                // 1. Clase a probar: SalaDAO
                Assert.IsNotNull(salaDAO);
                // 2. Declaramos e instanciamos la entidad de dominio
                Sala salaACrear = new Sala();
                salaACrear.Nombre = "SALA VIP";
                salaACrear.Capacidad = 100;
                salaACrear.Caracteristicas = "GRANDE";
                salaACrear.Comentarios = "BUENA ACUSTICA";
                salaACrear.Local.CodLocal = 2;
                // 3. Declaramos la entidad que contendrá el resultado
                Sala salaCreado = null;
                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    salaCreado = salaDAO.Crear(salaACrear);
                    codigoGenerado = salaCreado.CodSala;
                }, "Sala creada");
                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(salaCreado);
                // Probamos que el código generado sea mayor a 0
                Assert.Greater(salaCreado.CodSala, 0);
                // Probamos que el nombre registrado es igual al solicitado con la entidad
                Assert.AreEqual(salaCreado.Nombre, salaACrear.Nombre);
                // Probamos que la caracteristica registrada es igual a la solicitada con la entidad
                Assert.AreEqual(salaCreado.Caracteristicas, salaACrear.Caracteristicas);
            }
            [Test]
            public void Test2_Obtener()
            {
                // 1. Clase a probar: SalaDAO
                Assert.IsNotNull(salaDAO);
                // 2. Definimos los datos para la prueba
                int codigo = codigoGenerado;
                // 3. Declaramos la entidad que contendrá el resultado
                Sala salaObtenido = null;
                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    salaObtenido = salaDAO.Obtener(codigo);
                });
                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(salaObtenido);
                Assert.AreEqual(salaObtenido.CodSala,codigo);
                Assert.IsNotNullOrEmpty(salaObtenido.Nombre);
                //Assert.IsEmpty(salaObtenido.Capacidad);
                Assert.IsNotNullOrEmpty(salaObtenido.Caracteristicas);
                Assert.IsNotNullOrEmpty(salaObtenido.Comentarios);
            }
            [Test]
            public void Test3_Modificar()
            {
                // 1. Clase a probar: SalaDAO
                Assert.IsNotNull(salaDAO);
                // 2. Declaramos e instanciamos la entidad de dominio
                codigoGenerado = 1;
                Sala salaAModificar = salaDAO.Obtener(codigoGenerado);
                salaAModificar.Nombre = "SALA SUPER VIP";
                salaAModificar.Capacidad = 120;
                salaAModificar.Caracteristicas = "PEQUEÑO";
                salaAModificar.Comentarios = "POCA ACUSTICA";
                // 3. Declaramos la entidad que contendrá el resultado
                Sala salaModificado = null;
                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    salaModificado = salaDAO.Modificar(salaAModificar);
                }, "sala modificada");
                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(salaModificado);
                // Probamos que el código generado sea mayor a 0
                Assert.AreEqual(salaModificado.CodSala, codigoGenerado);
                // Probamos que el nombre registrado es igual al solicitado con la entidad
                Assert.AreEqual(salaModificado.Nombre, salaAModificar.Nombre);
                // Probamos que la capacidad registrado es igual al solicitado con la entidad
                Assert.AreEqual(salaModificado.Capacidad, salaAModificar.Capacidad);
                // Probamos que las caracteristicas registrada es igual a la solicitada con la entidad
                Assert.AreEqual(salaModificado.Caracteristicas, salaAModificar.Caracteristicas);
                // Probamos que los comentarios registrada es igual a la solicitada con la entidad
                Assert.AreEqual(salaModificado.Comentarios, salaAModificar.Comentarios);
            }

            [Test]
            public void Test4_Eliminar()
            {
                // 1. Clase a probar: salaDAO
                Assert.IsNotNull(salaDAO);

                // 2. Declaramos e instanciamos la entidad de dominio a eliminar
                codigoGenerado = 3;
                Sala salaAEliminar = salaDAO.Obtener(codigoGenerado);

                // 3. Declaramos la entidad que contendrá el resultado
                Sala salaEliminada = null;

                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    salaDAO.Eliminar(salaAEliminar);
                }, "Sala eliminada");

                // Probamos que la entidad resultante no sea nula
                Assert.IsNull(salaEliminada);

            }

        }
    }
}



